// axios实例的封装
import axios, { type Method } from 'axios'
import useUserStore from '@/stores/modules/user'
import { showToast } from 'vant'
import router from '@/router'
// 创建axios实例  配置基地址 timeout
export const baseURL = 'https://consult-api.itheima.net'
const instance = axios.create({
  baseURL,
  timeout: 10000 // 请求超时时长
})
// 配置请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 统一挂载请求头token
    if (useUserStore().user?.token) {
      config.headers.Authorization = `Bearer ${useUserStore().user?.token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么

    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    console.log(response)
    // 如果进入了这个分支,说明响应是有问题的
    if (response.data.code !== 10000) {
      // 1. 提示
      showToast(response.data.message || '网络异常')
      // 2. 手动抛出一个错误的promise
      return Promise.reject(response.data.message)
    }
    // 响应消息提示
    return response.data // 直接将需要的data数据剥离
  },
  function (error) {
    // token失效处理
    if (error.response.data.code === 401) {
      // 1. 清除个人信息
      useUserStore().delUser()
      // console.log(router.currentRoute.value.fullPath) // token失效处理完毕后要去的页面
      // 2. 跳转到登录页面重新登录
      router.push('/login?backURL=' + router.currentRoute.value.fullPath)
    }
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

// 之前会在api/xx.js文件封装接口 准备测试 之前做的接口一个个函数中 url method data 都要加
// 我们要封装一个request方法,这个方法中只需要接收请求地址,请求方式 参数就可以了
// 类似于request('/user', 'get', {page: 1, pagesize: 1}) 、 request('/add', 'post', {name: 'zs'})

export const request = <T>(
  url: string,
  method: Method = 'get',
  submitData?: object
) => {
  // 参数1是传递的泛型, 参数2是重置覆盖 axios默认的类型声明
  return instance.request<T, { code: number; message: string; data: T }>({
    url,
    method,
    // get请求携带参数params ,post请求携带参数是data
    // params:submitData
    // data:submitData
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
// request('/login/password', 'post', {
//   mobile: '13211112222',
//   password: 'abc12345'
// }).then((res) => {
//   console.log(res.data.data.token)
// })
